package com.hs.framework.utils;

import android.content.Context;

import com.tencent.mmkv.MMKV;

import java.util.Set;

public class MMKVUtil {

    private static MMKV mmkv;

    /**
     * 初始化MMKV，一般在Application的onCreate方法中调用
     *
     * @param context 应用的上下文
     */
    public static void init(Context context) {
        MMKV.initialize(context);
        mmkv = MMKV.defaultMMKV();
    }

    // 以下是针对基本数据类型的存储和读取方法

    /**
     * 存储布尔类型数据
     *
     * @param key   键
     * @param value 值
     */
    public static void putBoolean(String key, boolean value) {
        mmkv.encode(key, value);
    }

    /**
     * 获取布尔类型数据
     *
     * @param key      键
     * @param defValue 默认值（如果键对应的数据不存在，则返回该默认值）
     * @return 对应键的布尔值
     */
    public static boolean getBoolean(String key, boolean defValue) {
        return mmkv.decodeBool(key, defValue);
    }

    /**
     * 存储整型数据
     *
     * @param key   键
     * @param value 值
     */
    public static void putInt(String key, int value) {
        mmkv.encode(key, value);
    }

    /**
     * 获取整型数据
     *
     * @param key      键
     * @param defValue 默认值（如果键对应的数据不存在，则返回该默认值）
     * @return 对应键的整型值
     */
    public static int getInt(String key, int defValue) {
        return mmkv.decodeInt(key, defValue);
    }

    /**
     * 存储长整型数据
     *
     * @param key   键
     * @param value 值
     */
    public static void putLong(String key, long value) {
        mmkv.encode(key, value);
    }

    /**
     * 获取长整型数据
     *
     * @param key      键
     * @param defValue 默认值（如果键对应的数据不存在，则返回该默认值）
     * @return 对应键的长整型值
     */
    public static long getLong(String key, long defValue) {
        return mmkv.decodeLong(key, defValue);
    }

    /**
     * 存储浮点型数据
     *
     * @param key   键
     * @param value 值
     */
    public static void putFloat(String key, float value) {
        mmkv.encode(key, value);
    }

    /**
     * 获取浮点型数据
     *
     * @param key      键
     * @param defValue 默认值（如果键对应的数据不存在，则返回该默认值）
     * @return 对应键的浮点型值
     */
    public static float getFloat(String key, float defValue) {
        return mmkv.decodeFloat(key, defValue);
    }

    /**
     * 存储字符串类型数据
     *
     * @param key   键
     * @param value 值
     */
    public static void putString(String key, String value) {
        mmkv.encode(key, value);
    }

    /**
     * 获取字符串类型数据
     *
     * @param key      键
     * @param defValue 默认值（如果键对应的数据不存在，则返回该默认值）
     * @return 对应键的字符串值
     */
    public static String getString(String key, String defValue) {
        return mmkv.decodeString(key, defValue);
    }

    // 以下是针对复杂数据类型（以List为例，这里以存储String类型的List为例，可根据需求扩展）的存储和读取方法

    /**
     * 存储字符串列表类型数据
     *
     * @param key    键
     * @param values 值（字符串列表）
     */
//    public static void putStringList(String key, List<String> values) {
//        mmkv.encode(key, values);
//    }
//
//    /**
//     * 获取字符串列表类型数据
//     *
//     * @param key      键
//     * @param defValue 默认值（如果键对应的数据不存在，则返回该默认值，这里默认值为一个空的字符串列表）
//     * @return 对应键的字符串列表值
//     */
//    public static List<String> getStringList(String key, List<String> defValue) {
//        return mmkv.decodeStringArrayList(key, defValue);
//    }

    // 以下是针对集合类型（以Set为例，这里以存储String类型的Set为例，可根据需求扩展）的存储和读取方法

    /**
     * 存储字符串集合类型数据
     *
     * @param key    键
     * @param values 值（字符串集合）
     */
    public static void putStringSet(String key, Set<String> values) {
        mmkv.encode(key, values);
    }

    /***
     * 删除所有的建
     */
    public static void removeAll(){
       try {
           mmkv.clearAll();
       }catch (Exception e){
           e.printStackTrace();
       }
    }

    /**
     * 移除键
     * @param key
     */
    public static void removeKey(String key){
       try {
           mmkv.remove(key);
       }catch (Exception e){
           e.printStackTrace();
       }
    }

    /**
     * 获取字符串集合类型数据
     *
     * @param key      键
     * @param defValue 默认值（如果键对应的数据不存在，则返回该默认值，这里默认值为一个空的字符串集合）
     * @return 对应键的字符串集合值
     */
    public static Set<String> getStringSet(String key, Set<String> defValue) {
        return mmkv.decodeStringSet(key, defValue);
    }
}